//  网络请求封装
// 引入 uni-ajax 模块
// hx 安装导入的方式
import ajax from '@/uni_modules/u-ajax'
// npm 安装导入的方式
// import ajax from 'uni-ajax'
import { useUserStore } from '@/stores/user.js'

// 创建请求实例
const instance = ajax.create({
	// 1. 后台请求的基础地址
	baseURL: 'https://slwl-api.itheima.net'
})

// 添加请求拦截器=》发请求之前执行
instance.interceptors.request.use(
	config => {
		// 在发送请求前做些什么
		// 显示 loading
		uni.showLoading({
			title: '拼命加载中...',
			mask: true
		})

		// 场景 1：header 请求头统一添加 token
		const store = useUserStore()
		if (store.token) {
			config.header.Authorization = store.token
		}
		return config
	},
	error => {
		// 对请求错误做些什么
		return Promise.reject(error)
	}
)

// 添加响应拦截器=》请求响应之后执行
instance.interceptors.response.use(
	response => {
		// 对响应数据做些什么
		// 请求 200 执行
		// 场景 2：简化返回的数据和错误的统一处理
		if (response.data.code !== 200) {
			setTimeout(() => {
				uni.showToast({
					title: response.data.msg
				})
			}, 1000)
			// 对外抛出错误
			return Promise.reject(response.data)
		}

		uni.hideLoading()
		return response.data
	},
	error => {
		// 对响应错误做些什么
		// 请求 不是 200 执行
		//  场景 3: token 失效（401） 处理

		if (error.statusCode === 401) {
			// 页面栈=> 页面访问的历史记录
			const pageStack = getCurrentPages()
			// 当前页面地址=》使用全路径，因为他会携带页面上的参数
			//  回顾：vue 获取当前页面的地址=》router.currRoute.path ｜｜ router.currRoute.fullPath(全路径)
			//  说明：fullPath（全路径）= path地址 + query 参数
			const fullPath = pageStack[pageStack.length - 1].$page.fullPath
			// encodeURIComponent() 函数只对特殊字符进行编码，而不会对字母、数字和其他常见字符进行编码。
			// 确保 URL 的可读性和兼容性，保障参数的正确传递=》代码更严谨
			// redirectURL 回跳地址
			uni.redirectTo({
				url: `/pages/login/index?redirectURL=${encodeURIComponent(fullPath)}`,
			})
		}

		uni.hideLoading()
		return Promise.reject(error)
	}
)

// 导出 create 创建后的实例
export default instance